<template>
  <div>
    <!-- 标题 -->
    <van-nav-bar title='登录' />
    <!-- 表单 -->
    <van-cell-group>
      <!-- 调用 Vant方法 @input是监测输入内容 :error-message是提示信息 -->
      <!-- 给:error-message设置一个 对象储存其数据 进行判断 -->
      <van-field @input='validateMobile' :error-message="mobileMsg" v-model="mobile" label="手机号" placeholder="请输入手机号" />
      <van-field @input="validateCode" :error-message="codeMsg" v-model="code" label="验证码" placeholder="请输入验证码">
        <!-- #button 调用Vant的button具名插槽 里面填充内容 -->
        <!-- size 是控制器大小 -->
        <template #button>
          <van-button class="p5" native-type="submit" slot="button" size="small" type="primary">发送验证码</van-button>
        </template>
      </van-field>
    </van-cell-group>
    <!-- 提交按钮 -->
    <div class="btn">
      <!-- :loading 响应式方法 控制按钮是否加载 参数是布尔值 -->
      <van-button :loading='isLoading' native-type="submit" @click="getLogin" type="info" block round>登 录</van-button>
    </div>
  </div>
</template>
<script>
// 1. 传入 login axios 组件 login是登录验证axios命名方法名称
import { login } from '../api/login'
export default {
  // 2. 设置 用户输入数据的储存
  data () {
    return {
      mobile: '',
      code: '',
      //! 错误提示-手机号
      mobileMsg: '',
      //! 错误提示-验证码
      codeMsg: '',
      // ? 登录按钮的加载状态(布尔值 默认要设置flase 让用户能点)
      isLoading: false
    }
  },
  methods: {
    //! 进行手机号输入验证操作
    validateMobile () {
      //! 1. 进行手机号格式判断
      if (!this.mobile) {
        this.mobileMsg = '请输入手机号'
      } else if (!/^1[34578]\d{9}$/.test(this.mobile)) {
        this.mobileMsg = '手机号格式不正确'
      } else {
        //! 2.手机号验证通过 取消提示
        this.mobileMsg = ''
      }
    },
    validateCode () {
      //! 3. 进行验证码格式判断(六位数验证码)
      if (!this.code) {
        this.codeMsg = '请输入验证码'
      } else if (!/^\d{6}$/.test(this.code)) {
        this.codeMsg = '验证码格式不正确'
      } else {
        //! 4. 验证通过 取消提示
        this.codeMsg = ''
      }
    },
    // 3. 创建数据验证方法
    async getLogin () {
      // 4. 用try catch 来判断 数据是否接收成功 提示用户
      try { // 给服务器发送信息
        //! 5. 调用登录效验方法
        this.validateMobile()
        this.validateCode()
        //! 6. 通过提示信息判断是否效验成功 不成功 提示用户失败 跳出判断
        if (this.mobileMsg !== '' || this.codeMsg !== '') {
          //! 8. 失败了 跳出循环
          return this.$toast('请输入手机号或者验证码')
        }
        // ? 登录时候进行接口调用 让其转起来 防止重复提交表单
        this.isLoading = true
        // 5. 传入用户输入的数值 login是封装的axios登录验证方法名称
        const ret = await login(this.mobile, this.code)
        // 6. 进行判断 获取数据 如果获取成功 保存后端返回的 token值 不成功提示用户

        // 7. 再进行判断 如果用户获取到后端的token 再让其登录
        if (ret.data.token && ret.data.refresh_token) {
          // 8. 保存token值(服务器缓存)
          // sessionStorage.setItem('保存名称', JSON.stringify(获取的token路径)); 保存token到服务器缓存
          // JSON.stringif()把获取的token转换成字符串
          sessionStorage.setItem('mytoken', JSON.stringify(ret.data))
          this.$router.push('/home')
        }
      } catch (error) {
        // 登录失败时候会进入 catch 参数是错误信息
        console.log(error)
        // 9. 提示用户登录失败 $toast是Vant提供的模板
        this.$toast('登录失败')
        // ? 登录失败的时候 还原按钮加载状态 让用户继续登录
        this.isLoading = false
      }
    }
  }
}
</script>
<style lang="less" scoped>
.btn {
  padding: 20px 40px;
}
</style>
